package org.dromara.easytl.ast;

import java.util.List;

/**
 * 方法调用节点
 * 表示对对象方法的调用，例如：user.getName() 或 list.size()
 * 
 * @author EasyTL Team
 */
public class MethodCall extends ASTNode {
    
    /** 对象表达式（可能为null，表示静态方法或全局函数） */
    private final ASTNode object;
    
    /** 方法名 */
    private final String methodName;
    
    /** 参数列表 */
    private final List<ASTNode> arguments;
    
    /** 是否为空安全调用（?.） */
    private final boolean safeNavigation;
    
    /**
     * 构造方法调用节点
     * 
     * @param object 对象表达式
     * @param methodName 方法名
     * @param arguments 参数列表
     * @param safeNavigation 是否为空安全调用
     */
    public MethodCall(ASTNode object, String methodName, List<ASTNode> arguments, boolean safeNavigation) {
        this.object = object;
        this.methodName = methodName;
        this.arguments = arguments;
        this.safeNavigation = safeNavigation;
    }
    
    /**
     * 获取对象表达式
     * 
     * @return 对象表达式
     */
    public ASTNode getObject() {
        return object;
    }
    
    /**
     * 获取方法名
     * 
     * @return 方法名
     */
    public String getMethodName() {
        return methodName;
    }
    
    /**
     * 获取参数列表
     * 
     * @return 参数列表
     */
    public List<ASTNode> getArguments() {
        return arguments;
    }
    
    /**
     * 是否为空安全调用
     * 
     * @return 如果是空安全调用返回true
     */
    public boolean isSafeNavigation() {
        return safeNavigation;
    }
    
    @Override
    public <T> T accept(ASTVisitor<T> visitor) {
        return visitor.visitMethodCall(this);
    }
    
    @Override
    public String toString() {
        return "MethodCall{" +
                "object=" + object +
                ", methodName='" + methodName + '\'' +
                ", arguments=" + arguments +
                ", safeNavigation=" + safeNavigation +
                '}';
    }
}

